#ifndef POWER_CONTROL_H
#define POWER_CONTROL_H

#include "main.h"
#include "supercap.h"
#include "bsp_tim1_pwm.h"
#include "adc_to_elec.h"
#include "tim.h"
#include "pid.h"

#define MAX_DUTY 0.94f                                //PWM最大占空比
#define MAX_DUTY2 2*MAX_DUTY                          //PWM最大占空比的两倍
#define MAX_PWM_CMP (uint32_t)(MAX_DUTY*1200)         //PWM的最比较值
#define MIN_PWM_CMP (uint32_t)((1-MAX_DUTY)*1200)     //PWM最小比较值
#define DP_PWM_PER 1200                               //定时器1的周期
#define MAX_VOLT_RATIO 1.4f                           //最大电压比值(比率)
#define MIN_VOLT_RATIO 0.1f                           //最小电压比值(比率)

/**
 * @brief 采样的数据
 */
typedef struct
{
    //ADC 原始数据缓冲区
    unsigned int adc1_buf[3];                               //输入电压, 输出电流, 输入电流
    unsigned int adc2_buf[2];                               //电容电流, 电容电压
    //电气滤波数据结构体
    elec_info_struct_t cap_c_filter;                        //电容电流
    elec_info_struct_t cap_v_filter;                        //电容电压
    elec_info_struct_t in_c_filter;                         //输入电流
    elec_info_struct_t in_v_filter;                         //输入电压
    elec_info_struct_t out_c_filter;                        //底盘电流
    //滤波后数据
    float in_v;                                             //输入电压
    float in_c;                                             //输入电流
    float in_p;                                             //输入功率
    float out_v;                                            //输出电压
    float out_c;                                            //输出电流
    float out_p;                                            //输出功率
    float dcdc_v;                                           //DCDC电压
    float dcdc_c;                                           //DCDC电流
    float dcdc_p;                                           //DCDC功率
    float cap_v;                                            //电容电压
    float cap_c;                                            //电容电流
    float cap_p;                                            //电容功率

    /* data */
}sample_t;

typedef struct
{
    pid_type_def powerin_loop, currout_loop, voltout_loop;  //三个环(功率，电流，电压)pid结构体
    float power_set;                                        //设定电池输入功率
    float dcdc_power;                                       //dcdc充放电设定功率
    float dcdc_curr;                                        //dcdc充放电设定电流
    float dcdc_max_curr;                                    //dcdc最大电流
    float cap_v_max;                                        //电容最大电压
    float cap_max_curr;                                     //电容最大电流
    float vloop_ratio;                                      //电压环输出
    float cloop_ratio;                                      //电流环输出
    float volt_ratio;                                       //最终输出电压比值 (Vout / Vin)
    /* data */
}power_control_t;

/**
 * @brief 电容状态枚举
 */
typedef enum
{
    CAP_CHARGE = 0,   //充电模式
    CAP_DISCHARGE,    //放电模式
    CAP_CUTOFF        //关断模式
}cap_mode_e;

/**
 * @brief 闭环状态枚举
 */
typedef enum
{
    CONTROL_CV = 0,  //恒压模式
    CONTROL_CC       //恒流模式
}control_mode_e;

/**
 * @brief 电容状态结构体
 */
typedef struct
{
    cap_mode_e capmode;             //充放电模式
    control_mode_e control_mode;    //环路模式
    uint8_t cap_percent;            //电容剩余电量的百分比
    /* data */
}status_t;


extern sample_t sample;                   //采样结构体
extern power_control_t power_control;     //控制结构体
extern status_t status;                   //状态结构体

#endif

